const Joi = require('joi');

/**
 * 验证中间件
 * @param {Object} schema 验证模式
 * @returns {Function} 中间件函数
 */
const validate = (schema) => {
  return (req, res, next) => {
    const { error } = schema.validate(req.body);
    
    if (error) {
      return res.status(400).json({
        code: 400,
        message: error.details[0].message
      });
    }
    
    next();
  };
};

// 用户注册验证模式
const registerSchema = Joi.object({
  username: Joi.string().min(3).max(50).required(),
  password: Joi.string().min(6).required(),
  email: Joi.string().email().optional()
});

// 用户登录验证模式
const loginSchema = Joi.object({
  username: Joi.string().required(),
  password: Joi.string().required()
});

// 微信登录验证模式
const wxLoginSchema = Joi.object({
  code: Joi.string().required()
});

// 游戏保存验证模式
const saveGameSchema = Joi.object({
  id: Joi.number().optional(),
  level: Joi.string().valid('easy', 'medium', 'hard').required(),
  board: Joi.array().items(Joi.array().items(Joi.number().min(0).max(9))).length(9).required(),
  elapsedTime: Joi.number().min(0).required(),
  mistakes: Joi.number().min(0).required(),
  hintsUsed: Joi.number().min(0).required()
});

// 游戏检查验证模式
const checkGameSchema = Joi.object({
  gameId: Joi.number().required(),
  board: Joi.array().items(Joi.array().items(Joi.number().min(0).max(9))).length(9).required(),
  elapsedTime: Joi.number().min(0).required(),
  mistakes: Joi.number().min(0).required(),
  hintsUsed: Joi.number().min(0).required()
});

// 游戏提示验证模式
const hintSchema = Joi.object({
  gameId: Joi.number().required(),
  row: Joi.number().min(0).max(8).required(),
  col: Joi.number().min(0).max(8).required()
});

// 用户信息更新验证模式
const updateUserSchema = Joi.object({
  username: Joi.string().min(3).max(50).optional(),
  email: Joi.string().email().optional(),
  avatar: Joi.string().optional(),
  password: Joi.string().min(6).optional()
});

module.exports = {
  validate,
  registerSchema,
  loginSchema,
  wxLoginSchema,
  saveGameSchema,
  checkGameSchema,
  hintSchema,
  updateUserSchema
};
